
%macro roberts 0
	movdqu xmm0, [esi]
	movdqu xmm1, [esi+edx]

	;--------------+
	; Roberts en X ;
	;--------------+

	pxor xmm7,xmm7

	; Desempaqueto xmm0

	movdqu xmm2,xmm0
	movdqu xmm3,xmm0
	punpcklbw xmm2,xmm7		; xmm2 = low
	punpckhbw xmm3,xmm7		; xmm3 = hi

	; desempaqueto xmm1

	movdqu xmm4, xmm1
	psrldq xmm4, 1

	movdqu xmm5,xmm4
	punpcklbw xmm4,xmm7		; xmm4 = low
	punpckhbw xmm5,xmm7		; xmm5 = hi

	; resto xmm0 -= xmm1

	psubw xmm2, xmm4
	psubw xmm3, xmm5

	; tomo valor absoluto y saturo

	pxor xmm7,xmm7
	pcmpgtw xmm7,xmm2
	pxor xmm2,xmm7
	psubw xmm2,xmm7
	pxor xmm7,xmm7
	pcmpgtw xmm7,xmm3
	pxor xmm3,xmm7
	psubw xmm3,xmm7

	; Empaqueto el resultado

;	psraw xmm2, 1
;	psraw xmm3, 1

	packuswb xmm2,xmm3

	;--------------+
	; Roberts en Y ;
	;--------------+

	; Desempaqueto xmm0

	psrldq xmm0, 1
	movdqu xmm3,xmm0

	punpcklbw xmm0,xmm7		; xmm3 = low
	punpckhbw xmm3,xmm7		; xmm4 = hi

	; desempaqueto xmm1

	movdqu xmm4,xmm1
	punpcklbw xmm1,xmm7		; xmm1 = low
	punpckhbw xmm4,xmm7		; xmm6 = hi

	; resto xmm0 -= xmm1

	psubw xmm0, xmm1
	psubw xmm3, xmm4

	; tomo valor absoluto y saturo

	pxor xmm7,xmm7
	pcmpgtw xmm7,xmm0
	pxor xmm0,xmm7
	psubw xmm0,xmm7
	pxor xmm7,xmm7
	pcmpgtw xmm7,xmm3
	pxor xmm3,xmm7
	psubw xmm3,xmm7

	; Empaqueto el resultado

;	psraw xmm2, 1
;	psraw xmm3, 1

	packuswb xmm0,xmm3

	; Sumo RobertsX y RobertsY

	paddusb xmm0,xmm2
	movdqu [edi],xmm0

	lea esi,[esi+15]
	lea edi,[edi+15]

%endmacro

asmRoberts:
	Entrar

	mov eax, W
	dec eax
	xor edx, edx
	mov ebx, 15
	div ebx				; eax = (W-1)/15
	sub ebx, edx		; ebx = 15 - (W-1)%15
	mov ecx, H
	dec ecx				; ecx = H-1
	mov edx, W

	mov esi, SRC
	mov edi, DST

	.fori:

		push ecx
		mov ecx, eax

		.forj:

			roberts

		dec ecx
		jnz .forj

		; acomodo las lineas y calculo el final

		sub esi, ebx
		sub edi, ebx
		roberts

		pop ecx
		inc esi
		inc edi

	dec ecx
	jnz .fori

	Salir
